introduction to big o notation and time complexity